//打开、创建数据库文件，对数据库进行操作、关闭数据库
#include<iostream>
#include<string>
#include<vector>
#include<sqlite3.h>

class SqliteHelper
{
private:
    //数据库名称
    std::string _dbfile;
    sqlite3* _handler;//数据库的操作句柄    
public:
    //定义函数指针类型
    typedef int(*SqliteCallback)(void*,int,char**,char**);
    SqliteHelper(const std::string& dbfile )
    :_dbfile(dbfile),_handler(nullptr)
    {}
    //打开文件
    bool open(int safe_level = SQLITE_OPEN_FULLMUTEX)//需要传入想要设置的安全等级，默认为串行，即SQLITE_OPEN_FULLMUTEX
    {
        //调用sqlite3_open_v2,判断返回值是否为SQLITE_OK，不是则调用函数失败
        int ret = sqlite3_open_v2(_dbfile.c_str() ,&_handler , SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_level , nullptr);
        if(ret != SQLITE_OK)
        {
            std::cout << "创建、打开sqlite数据库失败: ";
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }
    //执行sql语句，调用sqlite3_exec
    bool exec(const std::string& sql , const SqliteCallback& cb , void* args)
    {
        int sqlite3_exec(sqlite3*,                                  /* An open database 数据库的操作句柄*/
                        const char *sql,                           /* SQL to be evaluated  所要执行的sql语句*/
                        int (*callback)(void*,int,char**,char**),  /* Callback function  回调函数*/
                        void *,                                    /* 1st argument to callback  参数*/
                        char **errmsg                              /* Error msg written here  错误信息*/);  
        int ret = sqlite3_exec(_handler ,  sql.c_str() , cb , args , nullptr);
        if(ret != SQLITE_OK)
        {
            std::cout << "操作sqlite数据库失败: ";
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }
    //关闭数据库
    void close()
    {
        //调用sqlite3_close_v2
        if(_handler) sqlite3_close_v2(_handler);
    }
    ~SqliteHelper(){}
};